/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fuzzy;

/**
 *
 * @author Nathy
 */
public class Defuzzificacao {

    public double calculaVelocidadeFinal(double[] saidas) {
        //Os valores estabelecidos para a saida foram:
        double[] limitesVel = {0, 2, 4, 6, 27, 29, 30,32};
        Trapezio trap = new Trapezio();
        double velocidade = 0.0;
        double[] centroides = {0, 0, 0};
        double[] areas = {0, 0, 0};

        //vou aplicar o método do centróide
        //Calculo do centro de massa e area de cada um dos 3 trapezios
        for (int cont = 0; cont < 3; cont++) {
            //Soh vou trabalhar com saídas ativadas
            if (cont == 0) {
                double valor1 = trap.funcaoTrapezio(saidas[cont], limitesVel[0], limitesVel[1]);
                double valor2 = trap.funcaoTrapezio(saidas[cont], limitesVel[2], limitesVel[3]);
                double baseMaior = limitesVel[3] - limitesVel[0];
                double baseMenor = valor2 - valor1;
                areas[cont] = trap.calculaAreaTrapezio(saidas[cont], baseMenor, baseMaior);
                centroides[cont] = trap.calcCentroideTrapezio(limitesVel[0], limitesVel[3]);
            } else if (cont == 1) {
                double valor1 = trap.funcaoTrapezio(saidas[cont], limitesVel[2], limitesVel[3]);
                double valor2 = trap.funcaoTrapezio(saidas[cont], limitesVel[4], limitesVel[5]);
                double baseMaior = limitesVel[5] - limitesVel[2];
                double baseMenor = valor2 - valor1;
                areas[cont] = trap.calculaAreaTrapezio(saidas[cont], baseMenor, baseMaior);
                centroides[cont] = trap.calcCentroideTrapezio(limitesVel[2], limitesVel[5]);
            } else {
              //  System.out.println("Trazezio Velocidade 3");
                double valor1 = trap.funcaoTrapezio(saidas[cont], limitesVel[4], limitesVel[5]);
                double valor2 = trap.funcaoTrapezio(saidas[cont], limitesVel[6], limitesVel[7]);
                double baseMaior = limitesVel[7] - limitesVel[4];
                double baseMenor = valor2 - valor1;
                areas[cont] = trap.calculaAreaTrapezio(saidas[cont], baseMenor, baseMaior);
                centroides[cont] = trap.calcCentroideTrapezio(limitesVel[4], limitesVel[7]);
            }


            //  }
        }
        velocidade = this.calculoCentroDeMassa(centroides, areas);
        System.out.println("Velocidade resultante  "+ velocidade );


        return Math.round(velocidade);

    }

    /*Somatorio das areas dos trapezios* o centro de massa de cada trapezio
    div pelo somatorio das areas*/
   private double calculoCentroDeMassa(double[] centroides, double[] areas) {
        double sup = 0;
        double inf = 0;
        for (int cont = 0; cont < centroides.length; cont++) {
            sup = sup + centroides[cont] * areas[cont];
            inf = inf + areas[cont];
        }

        return sup / inf;
    }
}
